#include "StdAfx.h"
#include "TrayIcon.h"

namespace DuiLib
{
    CTrayIcon::CTrayIcon(void)
    {
        memset(&m_trayData, 0, sizeof(m_trayData));
        m_bEnabled = false;
        m_bVisible = false;
        m_hWnd = NULL;
        m_uMessage = UIMSG_TRAYICON;
    }

    CTrayIcon::~CTrayIcon(void)
    {
        DeleteTrayIcon();
    }

    void CTrayIcon::CreateTrayIcon( HWND _RecvHwnd, UINT _IconIDResource, LPCTSTR _ToolTipText, UINT _Message)
    {
        if(!_RecvHwnd || _IconIDResource <= 0 ){
            return;
        }
        if(_Message != 0) m_uMessage = _Message;
        m_hIcon = LoadIcon(CPaintManagerUI::GetInstance(), MAKEINTRESOURCE(_IconIDResource));
        m_trayData.cbSize = sizeof(NOTIFYICONDATA);
        m_trayData.hWnd     = _RecvHwnd;
        m_trayData.uID     = _IconIDResource;
        m_trayData.hIcon = m_hIcon;
        m_trayData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
        m_trayData.uCallbackMessage = m_uMessage;
        if(_ToolTipText) _tcscpy(m_trayData.szTip, _ToolTipText);
        Shell_NotifyIcon(NIM_ADD, &m_trayData);
        m_bEnabled = true;
    }

    void CTrayIcon::DeleteTrayIcon()
    {
        Shell_NotifyIcon(NIM_DELETE, &m_trayData);
        m_bEnabled = false;
        m_bVisible = false;
        m_hWnd = NULL;
        m_uMessage = UIMSG_TRAYICON;
    }

    bool CTrayIcon::SetTooltipText( LPCTSTR _ToolTipText )
    {
        if(_ToolTipText) _tcscpy(m_trayData.szTip,_ToolTipText);
        if (!m_bEnabled) return FALSE;
        m_trayData.uFlags = NIF_TIP;
        return Shell_NotifyIcon(NIM_MODIFY, &m_trayData) == TRUE;
    }

    bool CTrayIcon::SetTooltipText( UINT _IDResource )
    {
        TCHAR mbuf[256] = {0};
        LoadString(CPaintManagerUI::GetInstance(), _IDResource,mbuf, 256);
        return SetTooltipText(mbuf);
    }

    DuiLib::CDuiString CTrayIcon::GetTooltipText() const
    {
        return m_trayData.szTip;
    }

    bool CTrayIcon::SetIcon( HICON _Hicon )
    {
        if(_Hicon) m_hIcon = _Hicon;
        m_trayData.uFlags = NIF_ICON;
        m_trayData.hIcon = _Hicon;

        if (!m_bEnabled) return FALSE;
        return Shell_NotifyIcon(NIM_MODIFY, &m_trayData) == TRUE;

        return false;
    }

    bool CTrayIcon::SetIcon( LPCTSTR _IconFile )
    {
        HICON hIcon = LoadIcon(CPaintManagerUI::GetInstance(),_IconFile);
        return SetIcon(hIcon);
    }

    bool CTrayIcon::SetIcon( UINT _IDResource )
    {
        HICON hIcon = LoadIcon(CPaintManagerUI::GetInstance(), MAKEINTRESOURCE(_IDResource));
        return SetIcon(hIcon);
    }

    HICON CTrayIcon::GetIcon() const
    {
        HICON hIcon = NULL;
        hIcon = m_trayData.hIcon;
        return hIcon;
    }

    void CTrayIcon::SetHideIcon()
    {
        if (IsVisible()) {
            SetIcon((HICON)NULL);
            m_bVisible = TRUE;
        }
    }

    void CTrayIcon::SetShowIcon()
    {
        if (!IsVisible()) {
            SetIcon(m_hIcon);
            m_bVisible = FALSE;
        }
    }

    void CTrayIcon::RemoveIcon()
    {
        m_trayData.uFlags = 0;
        Shell_NotifyIcon(NIM_DELETE, &m_trayData);
        m_bEnabled = FALSE;
    }
}
